﻿using System.Collections.Generic;
using System.Data.SqlClient;
using grupo2DEWStudio7i.Dominio;
using System;

namespace grupo2DEWStudio7i.Persistencia.ADO
{
    public class ServicioDAO : IServicioDAO
    {
        //Dependencias
        IReservaDAO reservaDAO = new ReservaDAO();

        public Servicio Crear(Servicio servicioCrear)
        {
            string _SQL = @"INSERT INTO servicio(codigo, descripcion, costohora)
                            VALUES(@codigo, @descripcion, @costoxhora)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_SQL, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@descripcion",(servicioCrear.Descripcion == null) ? DBNull.Value.ToString() : servicioCrear.Descripcion));
                    _Comando.Parameters.Add(new SqlParameter("@costoxhora", servicioCrear.CostoXhora));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }

        public ICollection<Servicio> ListarxSala(int codigoSala)
        {
            string _SQL = "SELECT Servicio.* FROM detallesala inner join Servicio on detallesala.codigoSevicio = Servicio.codigo WHERE detallesala.codigoSala=@codigoSala";
            ICollection<Servicio> serviciosEncontrados = new List<Servicio>();
            Servicio servicioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_SQL, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigoSala", codigoSala));

                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            servicioEncontrado = new Servicio();
                            servicioEncontrado.Codigo = (int)_Resultado["codigo"];
                            servicioEncontrado.Descripcion = (string)_Resultado["descripcion"];
                            servicioEncontrado.CostoXhora = (int)_Resultado["costohora"];
                            serviciosEncontrados.Add(servicioEncontrado);
                        }
                    }
                }
            }
            return serviciosEncontrados;
        }


        public Servicio Obtener(int codigo)
        {
            string _SQL = "SELECT codigo, descripcion, costohora FROM servicio WHERE codigo = @codigo";
            Servicio servicioCreado = null;
            using(SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_SQL, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        { 
                            servicioCreado = new Servicio();
                            servicioCreado.Codigo = (int)_Resultado["codigo"];
                            servicioCreado.Descripcion = (string)_Resultado["descripcion"];
                            servicioCreado.CostoXhora = (int)_Resultado["costohora"];
                        }
                    }
                }
            }
            return servicioCreado;
        }

        public Servicio Modificar(Servicio servicioModificar)
        {
            string _SQL = @"UPDATE servicio SET descripcion=@descripcion, costohora=@costoxhora WHERE codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_SQL, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@descripcion", servicioModificar.Descripcion));
                    _Comando.Parameters.Add(new SqlParameter("@costoxhora", servicioModificar.CostoXhora));
                    _Comando.Parameters.Add(new SqlParameter("@codigo", servicioModificar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(servicioModificar.Codigo);
        }

        public void Eliminar(Servicio servicioEliminar)
        {
            string _SQL = "DELETE FROM servicio WHERE codigo = @codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using(SqlCommand _Comando = new SqlCommand(_SQL, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", servicioEliminar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        public ICollection<Servicio> ListarTodos()
        {
            string _SQL = "SELECT codigo, descripcion, costohora FROM servicio";
            ICollection<Servicio> serviciosEncontrados = new List<Servicio>();
            Servicio servicioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_SQL, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            servicioEncontrado = new Servicio();
                            servicioEncontrado.Codigo = (int)_Resultado["codigo"];
                            servicioEncontrado.Descripcion = (string)_Resultado["descripcion"];
                            servicioEncontrado.CostoXhora = (int)_Resultado["costohora"];
                            serviciosEncontrados.Add(servicioEncontrado);
                        }
                    }
                }
            }
            return serviciosEncontrados;
        }

        public ICollection<Servicio> ListarxBusqueda(int? _codigo, string _descripcion, int? _costoxhora)
        {
            string _SQL = "SELECT codigo, descripcion, costohora FROM servicio WHERE 1=1";
            ICollection<Servicio> serviciosEncontrados = new List<Servicio>();
            Servicio servicioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (_codigo != null)
                    {
                        _SQL = _SQL + " AND codigo=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", _codigo));
                    }
                    if (_descripcion != null)
                    {
                        _SQL = _SQL + " AND descripcion LIKE '%'+@descripcion+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@descripcion", _descripcion));
                    }
                    if (_costoxhora != null)
                    {
                        _SQL = _SQL + " AND costohora = @costoxhora";
                        _Comando.Parameters.Add(new SqlParameter("@caracteristicas", _costoxhora));
                    }
                    
                    _Comando.CommandText = _SQL;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            servicioEncontrado = new Servicio();
                            servicioEncontrado.Codigo = (int)_Resultado["codigo"];
                            servicioEncontrado.Descripcion = (string)_Resultado["descripcion"];
                            servicioEncontrado.CostoXhora = (int)_Resultado["costohora"];
                            serviciosEncontrados.Add(servicioEncontrado);
                        }
                    }
                }
            }
            return serviciosEncontrados;
        }

        //Metodo fuera de la interface
        private int GenerarNuevoCodigo()
        {
            string SQL = "SELECT max(codigo) FROM servicio";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(SQL, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado))
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }

            return _NuevoCodigo;
        }
    }
}